#include <iostream>

using namespace std;

class Dog{
public:
	mutable int age = 0;
	string name = NULL;
	Dog(int age, string name):age(age),name(name){
		// 进入构造函数之前会先执行初始化列表 为类成员赋值 然后再 执行构造函数的代码
		cout << "init: this age is " << this->age << endl;
	}
	void say() const{
		cout << "what a cute dog " << "age is " << age
			<< " name is " << name << endl;
		// 常函数里面调用非常函数 也是不允许的
		// setAge(89);	
	}
	int getAge(){
		return age;
	}
	void setAge(int age)// const 这里是不允许的 会报错
	{
		this->age = age;
	}
};
// 以引用的方式传入的形参 也是 常对象
void test(const Dog& dog){
	
	dog.age = 5;
	// dog.name = "tom&jerry";
	// dog.getAge();
	
	dog.say();
}
int main(){
	Dog dog(7, "大黄");
	dog.setAge(17);
	dog.say();
	
	test(dog);
	
	const Dog dog2 = dog;
	// 只有当 age变量被mutable修饰时 才可以直接赋值
	dog2.age = 9;
	// 这两个函数因为 不是常函数都会报错
	// dog2.setAge(13);
	// dog2.getAge();
	dog2.say();
	
	// 禁止操作
	//dog2 = dog;
	
	// 常量引用也是常对象
	const Dog& dog3 = dog;
	// dog3.setAge(19);
	dog3.say();
	
	cout << "end..." << endl;	
	return 0;
}